//axios进行二次封装
import Vue from 'vue'
import axios from 'axios';
import { Message } from 'element-ui'
import router from '@/router'
let $loading = null;
// 开启loading
const showLoading = (url) => {
    $loading = Vue.prototype.$loading({ text: i18n.t('user.loading')})
}
const hideLoading = () => {
    $loading = $loading.close()
}
//进度条
// import nprogress from 'nprogress';
// //因为进度条样式咱们没有引入
// import "nprogress/nprogress.css";
//引入Vuex仓库模块
// import store from '@/store';

//创建axios实例[创建出来的实例即为axios，只不过可以配置一些东西]
const service = axios.create({
    //可以给请求路径中添加一些参数 
    baseURL: process.env.VUE_APP_BASE_API,
    //设置请求时间（10S）
    timeout: 10000
});

let isShowSucMessage = false;
let isShowErrMessage = true;

let isShowLoading = true;
let requestingCount = 0;
const handleRequestLoading = (url) => {
    if (!requestingCount)  showLoading(url)
    requestingCount++
  }
  const handleResponseLoading = () => {
    requestingCount--
    if (!requestingCount)  hideLoading()
  }
//请求拦截器:在发请求之前可以检测到，可以干一些事情
service.interceptors.request.use((config) => {
    //通过上行请求的请求头，把用户临时身份带给服务器
    //请求头添加的属性名字不能瞎写，因为已经和后台人员商量好了
    //如果不叫做userTempid字段，服务器获取不到
    //config配置对象，这里面有请求头
    // config，请求拦截器的一个配置对象
    // if(store.state.shopcart.userTempId){
    //     config.headers.userTempId = store.state.shopcart.userTempId;
    // }
    // config.headers.TransferEncoding = "chunked";
    // config.headers['Transfer-Encoding'] = "chunked"
    // console.log('config',config,config.data,config.method);

    //用户身份token
    if(localStorage.getItem("token")){
        config.headers.token = localStorage.getItem("token");
    }
    // // post请求
    if (config.method == "post"){
        // console.log("configconfigconfig",config.data,requestingCount);
        let data = null
        // 如果是上传图片接口
        if (config.url == "/tool/base/image/active" || config.url == "/upload/aliyuncs/image/active") {
            data = config.data
        }else{
            data = config.data.params
        }

        // 如果设置了显示成功提示，默认为false
        if (data.isShowSucMessage) {
            isShowSucMessage = true
        }else{
            isShowSucMessage = false
        }
        // 如果设置了显示失败提示，默认为true
        if (data.isShowErrMessage == false) {
            isShowErrMessage = false
        }else{
            isShowErrMessage = true
        }
    
        
        //检测到程序发请求，请求拦截器可以检测到，进度条开始动
        // nprogress.start();
    
        // 如果设置了显示加载效果loading，默认为true
        if (data.isShowLoading == false) {
            isShowLoading = false
        }else{
            isShowLoading = true
            handleRequestLoading(config.url)
        }
        
        // if(isShowLoading){
            
        // }
    }else{
        // get请求
        // return response.data
    }
    
    return config;
},() => {
    if(isShowLoading){
        handleResponseLoading()
    }
});

//响应拦截器：服务器的数据已经返回了，可以干一些事情
service.interceptors.response.use((response) => {
    // console.log('response',response);
    if(isShowLoading){
        handleResponseLoading()
    }
    // post请求
    if (response.data.result) {
        console.log('response.data.result',response);
        const res = response.data.result
        //简化服务器返回的数据格式
        //服务器数据返回进度条结束
        // nprogress.done();
        // console.log('dddddddddd',res);
        switch (true) {
            case res.code !== 200:
                if (isShowErrMessage && document.getElementsByClassName('el-message').length <= 1) {
                    Message({
                        message: res.error || res.msg || "操作失败",
                        type: 'error',
                        duration: 3 * 1000
                    })
                }
              break;
            default://其他返回码，可以根据情况自行处理
                if (isShowSucMessage) {
                    Message({
                        message: res.msg || "操作成功",
                        type: 'success',
                        duration: 3 * 1000
                    })
                }
            }
            return res
        // return Promise.reject(new Error(res.msg || '内部错误2'))
    }else{
    // get请求
        return response.data
    }

}, (error) => {
    if(isShowLoading){
        handleResponseLoading()
    }

    if (document.getElementsByClassName('el-message').length <= 1) {
        console.log('requesrErr' + error) // for debug
        Message({
            message: error.error || error.msg || "获取数据失败，可能网络不太好",
            type: 'error',
            duration: 3 * 1000
        })
    }
    
    //终止promise链
    // return Promise.reject(error)
    return Promise.reject(new Error(error.error || error.msg || "请求超时，获取数据失败"))
});
//对外暴露二次封装的axios
export default service;